package 力扣;

import java.util.HashMap;
import java.util.Map;

/**
 给定一个字符串，请你找出其中不含有重复字符的 最长子串 的长度。

  

 示例 1:

 输入: s = "abcabcbb"
 输出: 3
 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。

 示例 2:
 输入: s = "bbbbb"
 输出: 1
 解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。

 示例 3:
 输入: s = "pwwkew"
 输出: 3
 解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
      请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。

 示例 4:
 输入: s = ""
 输出: 0

 */
public class _3无重复字符的最长子串 {

    public int lengthOfLongestSubstring(String s) {
        int ret= 0;
        Map<Character,Integer> map = new HashMap<Character,Integer>();
        // j 为上一次有重复值的索引位置
        for( int i =0,j=0;i< s.length();i++){

            if( map.containsKey(s.charAt(i))){ // 前一个相同值的索引和上一次有重复值的索引位置进行比较
                j = Math.max(map.get(s.charAt(i)),j);
            }
            ret = Math.max(ret,i-j+1);
            map.put(s.charAt(i),i+1);
        }

        return ret;
    }
}
